package views.mediators {
  import com.axon.base.managers.AxPopUpManager;
  import com.axon.dataservices.helpers.AxDSUtils;
  import com.axon.mvc.helpers.AxMvcUtils;
  import com.axon.mvc.helpers.AxVerbs;
  import com.axon.mvc.patterns.mediator.AxMediatorPopUp;

  import flash.display.DisplayObject;

  import helpers.Constants;
  import helpers.Utils;
  import helpers.Verbs;

  import models.vo.Analise;
  import models.vo.Pleito;
  import models.vo.User;
  import models.vo.Vistoria;

  import mx.collections.Sort;
  import mx.collections.SortField;
  import mx.controls.Alert;
  import mx.controls.Tree;

  import views.components.PleitoPropView;

  public class PleitoPropMediator extends AxMediatorPopUp {
    //////////////////////////////////////////////////////////////////////////////////////////////////////

    private var allowEdition:Boolean = false;

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function PleitoPropMediator(parent:DisplayObject, vo:Object, allowEdition:Boolean) {
      super(parent,
        vo,
        {model: Pleito, requestName: AxVerbs.READ},
        {text: "Falha na leitura do pleito."});

      this.allowEdition = allowEdition
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    private function get view():PleitoPropView {
      return viewComponent as PleitoPropView;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    override protected function initialize():void {
      regResponseInterest(Pleito, [Verbs.AVANCAR, Verbs.VOLTAR_PARA_ANALISE, Verbs.ARQUIVAR, Verbs.EDITAR_DATA_LAUDO]);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    override protected function viewValueObjectOk():void {
      var razaoSocial:String = Pleito(view.vo).empreendimento.getPjObjeto().razaoSocial;

      view.title = razaoSocial + " (" + Utils.geDescricaotStatusPleito(Pleito(view.vo).status) + ")";

      if (!Pleito(view.vo).passouPelaAnalise())
        view.tnavMain.removeChild(view.canvAnalise);

      if (!Pleito(view.vo).emAnaliseOuAcima())
        view.tnavMain.removeChild(view.canvRelatorios);

      view.pbAcao1.visible = allowEdition;
      view.pbAcao2.visible = allowEdition;
      view.pbArquivar.visible = allowEdition;

      if (allowEdition) {

        switch (Pleito(view.vo).status) {

          case Constants.STATUS_PLEITO_ANALISE:

            view.pbAcao1.label = 'Encaminhar para Certificação';
            view.pbAcao2.visible = false;
            view.pbArquivar.setStyle("left", view.pbAcao2.getStyle("left"));
            break;

          case Constants.STATUS_PLEITO_CERTIFICACAO:

            view.pbAcao1.label = 'Encaminhar para Recomendação';
            view.pbAcao2.label = 'Voltar para Análise';
            break;

          case Constants.STATUS_PLEITO_RECOMENDACAO:

            view.pbAcao1.label = 'Encaminhar para Deliberação';
            view.pbAcao2.label = 'Voltar para Análise';
            break;

          case Constants.STATUS_PLEITO_DELIBERACAO:

            view.pbAcao1.label = 'Aprovar Pleito';
            view.pbAcao2.label = 'Voltar para Análise';
            break;

        }
      }
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventViewCreated(body:Object):void {

      var pleito:Pleito;

      switch (body) {

        case view.tabDadosGerais:

          view.tabDadosGerais.pleito = Pleito(view.vo);

          if (view.tabDadosGerais.pleito.getIncentivo().mnemonic == "red_75_irpj" || view.tabDadosGerais.pleito.getIncentivo().mnemonic == "red_12_5_irpj") {
            view.tnavMain.removeChild(view.canvCaracterizacao2);
            view.tnavMain.removeChild(view.canvCaracterizacao3);
          } else if (view.tabDadosGerais.pleito.getIncentivo().mnemonic == "isencao_afrmm_iof" || view.tabDadosGerais.pleito.getIncentivo().mnemonic == "depreciacao_acelerada") {
            view.tnavMain.removeChild(view.canvCaracterizacao);
            view.tnavMain.removeChild(view.canvCaracterizacao3);
          } else if (view.tabDadosGerais.pleito.getIncentivo().mnemonic == "reinvestimento_30_irpj") {
            view.tnavMain.removeChild(view.canvCaracterizacao);
            view.tnavMain.removeChild(view.canvCaracterizacao2);
          }

          break;

        case view.tabEmpreeendimento:

          view.tabEmpreeendimento.vo = view.vo;

          var sort:Sort;

          sort = new Sort();
          sort.fields = [new SortField('descricaoBreve', true)];
          Pleito(view.vo).getDocumentosApresentados().sort = sort;
          Pleito(view.vo).getDocumentosApresentados().refresh();

          sort = new Sort();
          sort.fields = [new SortField('nome', true)];
          Pleito(view.vo).empreendimento.getConselheiros().sort = sort;
          Pleito(view.vo).empreendimento.getConselheiros().refresh();

          sort = new Sort();
          sort.fields = [new SortField('nome', true)];
          Pleito(view.vo).empreendimento.getGerentes().sort = sort;
          Pleito(view.vo).empreendimento.getGerentes().refresh();

          sort = new Sort();
          sort.fields = [new SortField('acoes', true, true, true), new SortField('nome', true)];
          Pleito(view.vo).empreendimento.getAcionistas().sort = sort;
          Pleito(view.vo).empreendimento.getAcionistas().refresh();

          sort = new Sort();
          sort.fields = [new SortField('modalidade', true, true, true)];
          Pleito(view.vo).empreendimento.getBeneficios().sort = sort;
          Pleito(view.vo).empreendimento.getBeneficios().refresh();
		  
          break;

        case view.tabCaracterizacao:

          var treeView:Tree = (view.tabCaracterizacao.treeAtivProd as Tree);

          if (!facade.hasMediator(AxMvcUtils.getMediatorClassNameByViewInstance(view.tabCaracterizacao)))
            facade.registerMediator(new PleitoPropCaracterizacaoMediator(view.tabCaracterizacao));

          view.tabCaracterizacao.allowEdition = allowEdition && Pleito(view.vo).emAnalise();

          pleito = Pleito(view.vo);

          view.tabCaracterizacao.vo = view.vo;
          view.tabCaracterizacao.treeData = pleito.getCaracterizacao().getAtivProdTreeData(pleito.getIncentivo().mnemonic);

          switch (Pleito(view.tabCaracterizacao.vo).getCaracterizacao().tipoProjeto) {

          case "implantacao":
          case "diversificacao":
            view.tabCaracterizacao.labelDataOperacional = "Início Operação";
            break;
          case "ampliacao":
            view.tabCaracterizacao.labelDataOperacional = "Fim Ampliação";
            break;
          default:
            view.tabCaracterizacao.labelDataOperacional = "Fim Modernização";
        }

          treeView.validateNow();
          treeView.selectedIndex = 0;
          treeView.expandChildrenOf(treeView.selectedItem, true);
          treeView.setFocus();

          break;

        case view.tabCaracterizacao2:

          if (!facade.hasMediator(AxMvcUtils.getMediatorClassNameByViewInstance(view.tabCaracterizacao2)))
            facade.registerMediator(new PleitoPropCaracterizacao2Mediator(view.tabCaracterizacao2));
          view.tabCaracterizacao2.allowEdition = allowEdition && Pleito(view.vo).emAnalise();
          view.tabCaracterizacao2.vo = view.vo;

          if (Pleito(view.vo).getIncentivo().mnemonic == "isencao_afrmm_iof") {
            view.tabCaracterizacao2.vsDescricao.selectedChild = view.tabCaracterizacao2.canvAFRMMeIOF;
            view.tabCaracterizacao2.tnavMain.removeChild(view.tabCaracterizacao2.tabDepreciaveis);
            view.tabCaracterizacao2.tnavMain.removeChild(view.tabCaracterizacao2.tabBens);
            view.tabCaracterizacao2.tnavMain.removeChild(view.tabCaracterizacao2.tabProdutos);
            view.tabCaracterizacao2.tabProdutos.label = "Produtos e Insumos";
          } else if (Pleito(view.vo).getIncentivo().mnemonic == "depreciacao_acelerada") {
            view.tabCaracterizacao2.tnavMain.removeChild(view.tabCaracterizacao2.tabBens);
            view.tabCaracterizacao2.tnavMain.removeChild(view.tabCaracterizacao2.tabProdutos);
            view.tabCaracterizacao2.vsDescricao.selectedChild = view.tabCaracterizacao2.canvDepreciacaoDesconto;
            view.tabCaracterizacao2.tabProdutos.label = "Produtos";
          }
          break;

        case view.tabCaracterizacao3:

          if (!facade.hasMediator(AxMvcUtils.getMediatorClassNameByViewInstance(view.tabCaracterizacao3)))
            facade.registerMediator(new PleitoPropCaracterizacao3Mediator(view.tabCaracterizacao3));
          view.tabCaracterizacao3.allowEdition = allowEdition && Pleito(view.vo).emAnalise();
          view.tabCaracterizacao3.vo = view.vo;
          view.tabCaracterizacao3.tnavMain.removeChild(view.tabCaracterizacao3.tabProdutos);
          break;

        case view.tabAnalise:

          if (!facade.hasMediator(AxMvcUtils.getMediatorClassNameByViewInstance(view.tabAnalise)))
            facade.registerMediator(new PleitoPropAnaliseMediator(view.tabAnalise));

          view.tabAnalise.allowEdition = allowEdition && Pleito(view.vo).emAnalise();
          view.tabAnalise.vo = view.vo;

          switch (Pleito(view.vo).getIncentivo().mnemonic) {

          case "red_75_irpj":
            view.tabAnalise.labelVistoria1 = "Análise do processo produtivo";
            view.tabAnalise.labelVistoria2 = "Informações complementares";
            view.tabAnalise.labelVistoria3 = "Conclusão da vistoria";
            break;

          case "red_12_5_irpj":
            view.tabAnalise.labelVistoria1 = "Roteiro e registro da vistoria";
            view.tabAnalise.labelVistoria2 = "Informações complementares";
            view.tabAnalise.labelVistoria3 = "Conclusão da vistoria";
            break;

          case "isencao_afrmm_iof":
            view.tabAnalise.labelVistoria1 = "Roteiro e registro da vistoria";
            view.tabAnalise.labelVistoria2 = "Informações complementares";
            view.tabAnalise.labelVistoria3 = "Conclusão da vistoria";
            break;

          case "depreciacao_acelerada":
            view.tabAnalise.labelVistoria1 = "";
            view.tabAnalise.labelVistoria2 = "";
            view.tabAnalise.labelVistoria3 = "";
            break;

          case "reinvestimento_30_irpj":
            view.tabAnalise.labelVistoria1 = "";
            view.tabAnalise.labelVistoria2 = "";
            view.tabAnalise.labelVistoria3 = "";
            break;

        }

          view.tabAnalise.vistoria = AxDSUtils.clone(Pleito(view.vo).getAnalise().getVistoria()) as Vistoria;
          view.tabAnalise.analise = AxDSUtils.clone(Pleito(view.vo).getAnalise()) as Analise;

          if (Pleito(view.vo).getIncentivo().mnemonic == "depreciacao_acelerada" || Pleito(view.vo).getIncentivo().mnemonic == "reinvestimento_30_irpj") {
            view.tabAnalise.tnavMain.removeChild(view.tabAnalise.tabVistoria);
            view.tabAnalise.tnavMain.removeChild(view.tabAnalise.tabFotos);
          }
          break;

        case view.hboxRelatorios:

          view.relatorios.filterFunction = filterFunctionRelatorio;
          view.relatorios.refresh();
          view.listRelatorios.selectedIndex = -1;
          view.listRelatorios.setFocus();
          break;

        case view.tabHistorico:

          view.tabHistorico.vo = view.vo;
          break;
      }
    }

    private function filterFunctionRelatorio(item:Object):Boolean {
      return (item.context as Array).indexOf(Pleito(view.vo).getIncentivo().mnemonic) >= 0;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventSelectionChange(body:Object):void {
      if (body == view.listRelatorios) {

        view.selectedRelatorio = view.listRelatorios.selectedItem;

        if (!view.selectedRelatorio) {
          if (view.pbGerarRelatorio)
            view.pbGerarRelatorio.enabled = false;
          return;
        }

        view.pbEditarDataLaudo.visible = (
          view.selectedRelatorio.data == "relatPortariaMinuta" ||
          view.selectedRelatorio.data == "relatPortariaVersaoFinal" ||
          view.selectedRelatorio.data == "relatLaudoMinuta" ||
          view.selectedRelatorio.data == "relatLaudoVersaoFinal" ||
          view.selectedRelatorio.data == "relatOficioEmpresa" ||
          view.selectedRelatorio.data == "relatOficioEmpresaLiberacao" ||
          view.selectedRelatorio.data == "relatOficioReceita" ||
          view.selectedRelatorio.data == "relatOficioBnb" ||
          view.selectedRelatorio.data == "relatOficioMarinha");

        view.pbEditarDataLaudo.enabled = false;

        switch (view.selectedRelatorio.data) {

          case "relatRelVistoria":
          case "relatRelAnalise":
          case "relatParecerAnalise":
          case "relatFluxoTramitacao":

            view.pbGerarRelatorio.enabled = (AppFacade(facade).sessionProxy.user.ehAnalistaOuSuperior());
            break;

          case "relatFluxoTramitacao":
            view.pbGerarRelatorio.enabled = (AppFacade(facade).sessionProxy.user.ehAnalistaOuSuperior() && Pleito(view.vo).emCertificacaoOuAcima());
            break;

          case "relatPortariaMinuta":

            view.pbGerarRelatorio.enabled = (AppFacade(facade).sessionProxy.user.ehAnalistaOuSuperior() && Pleito(view.vo).emAnaliseOuAcima());
            view.pbEditarDataLaudo.enabled = (AppFacade(facade).sessionProxy.user.hasRole(User.ROLE_ADMINISTRADOR)) && (Pleito(view.vo).emAnaliseOuAcima() && view.pbGerarRelatorio.enabled);
            break;

          case "relatPortariaVersaoFinal":

            view.pbGerarRelatorio.enabled = (AppFacade(facade).sessionProxy.user.ehAnalistaOuSuperior() && Pleito(view.vo).emCertificacaoOuAcima());
//            view.pbGerarRelatorio.enabled = (AppFacade(facade).sessionProxy.user.ehRecomendadorOuSuperior() && Pleito(view.vo).aprovado());
            view.pbEditarDataLaudo.enabled = (AppFacade(facade).sessionProxy.user.hasRole(User.ROLE_ADMINISTRADOR)) && (Pleito(view.vo).emAnaliseOuAcima() && view.pbGerarRelatorio.enabled);
            break;

          case "relatLaudoMinuta":

            view.pbGerarRelatorio.enabled = (AppFacade(facade).sessionProxy.user.ehAnalistaOuSuperior()) && (Pleito(view.vo).emAnaliseOuAcima());
            view.pbEditarDataLaudo.enabled = (AppFacade(facade).sessionProxy.user.hasRole(User.ROLE_ADMINISTRADOR)) && (Pleito(view.vo).emAnaliseOuAcima() && view.pbGerarRelatorio.enabled);
            break;

          case "relatLaudoVersaoFinal":

            view.pbGerarRelatorio.enabled = (AppFacade(facade).sessionProxy.user.ehAnalistaOuSuperior()) && (Pleito(view.vo).emCertificacaoOuAcima() || Pleito(view.vo).arquivado());
//            view.pbGerarRelatorio.enabled = (AppFacade(facade).sessionProxy.user.ehRecomendadorOuSuperior()) && (Pleito(view.vo).aprovado() || Pleito(view.vo).arquivado());
            view.pbEditarDataLaudo.enabled = (AppFacade(facade).sessionProxy.user.hasRole(User.ROLE_ADMINISTRADOR)) && (Pleito(view.vo).emAnaliseOuAcima() && view.pbGerarRelatorio.enabled);
            break;

          case "relatOficioReceita":
          case "relatOficioEmpresa":
          case "relatOficioEmpresaLiberacao":
          case "relatOficioReceita":
          case "relatOficioBnb":
          case "relatOficioMarinha":

            view.pbGerarRelatorio.enabled = (AppFacade(facade).sessionProxy.user.ehAnalistaOuSuperior() && Pleito(view.vo).emCertificacaoOuAcima());
//            view.pbGerarRelatorio.enabled = (AppFacade(facade).sessionProxy.user.ehRecomendadorOuSuperior() && Pleito(view.vo).aprovado());
            view.pbEditarDataLaudo.enabled = (AppFacade(facade).sessionProxy.user.hasRole(User.ROLE_ADMINISTRADOR)) && (Pleito(view.vo).emAnaliseOuAcima() && view.pbGerarRelatorio.enabled);
            break;
        }
      }
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventAvancarPopUp():void {
      var pleito:Pleito = Pleito(view.vo);

      if (pleito.emAnalise() && pleito.emExigencia()) {

        AxPopUpManager.messageDlg("Esse pleito tem exigências pendentes. Portanto, não pode ser encaminhado para a Certificação ainda.",
          "Exigências pendentes", Alert.OK, view)
        return;
      }

      callController(Pleito, Verbs.AVANCAR_POPUP, view.vo);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respPleitoAvancarSuccess(sender:Object, body:Object, extraInfo:Object):void {
      closePopUp();
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respPleitoVoltarParaAnaliseSuccess(sender:Object, body:Object, extraInfo:Object):void {
      closePopUp();
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respPleitoArquivarSuccess(sender:Object, body:Object, extraInfo:Object):void {
      closePopUp();
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respPleitoEditarDataLaudoSuccess(sender:Object, body:Object, extraInfo:Object):void {

      Pleito(view.vo).dataPortaria = Pleito(body).dataPortaria;
      Pleito(view.vo).numeroPortaria = Pleito(body).numeroPortaria;

      Pleito(view.vo).dataLaudo = Pleito(body).dataLaudo;
      Pleito(view.vo).numeroLaudo = Pleito(body).numeroLaudo;

      Pleito(view.vo).dataOficioEmpresa = Pleito(body).dataOficioEmpresa;
      Pleito(view.vo).numeroOficioEmpresa = Pleito(body).numeroOficioEmpresa;

      Pleito(view.vo).dataOficioEmpresaLiberacao = Pleito(body).dataOficioEmpresaLiberacao;
      Pleito(view.vo).numeroOficioEmpresaLiberacao = Pleito(body).numeroOficioEmpresaLiberacao;

      Pleito(view.vo).dataOficioReceita = Pleito(body).dataOficioReceita;
      Pleito(view.vo).numeroOficioReceita = Pleito(body).numeroOficioReceita;

      Pleito(view.vo).dataOficioBnb = Pleito(body).dataOficioBnb;
      Pleito(view.vo).numeroOficioBnb = Pleito(body).numeroOficioBnb;

      Pleito(view.vo).dataOficioMarinha = Pleito(body).dataOficioMarinha;
      Pleito(view.vo).numeroOficioMarinha = Pleito(body).numeroOficioMarinha;

    }

  }
}
